package com.java.comprehensive.arithmetic.leecode.tags.array;

import java.util.HashSet;
import java.util.Set;

/**
 * @Author: 窦绍飞
 * @Date: 2022/7/2
 */
public class LeetCode_36 {
	public static boolean isValidSudoku(char[][] board) {


		Set<String> set = new HashSet<>();

		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				char curr = board[i][j];
				//等于空直接循环
				if (curr == '.') continue;

				//计算不能重复的3*3坐标
				int boxIndex = i / 3 * 3 + j / 3;
				//直接通过存放字符串判断有没有重复
				String r = curr + "in row " + i;
				String c = curr + "in col " + j;
				String b = curr + "in box " + boxIndex;
				boolean add = set.add(r) && set.add(c) && set.add(b);
				if (!add) return false;
			}
		}
		return true;
	}

	public static boolean isValidSudokuTwo(char[][] board) {
		boolean[][] row = new boolean[9][9];
		boolean[][] col = new boolean[9][9];
		boolean[][] box = new boolean[9][9];

		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				char curr = board[i][j];
				//等于空直接循环
				if (curr == '.') continue;
				int index = curr - '1';
				//计算不能重复的3*3坐标
				int boxIndex = i / 3 * 3 + j / 3;
				if (row[i][index] || col[j][index] || box[boxIndex][index]) return false;
				row[i][index] = true;
				col[j][index] = true;
				box[boxIndex][index] = true;
			}
		}
		return true;
	}

	public static void main(String[] args) {
		char[][] board = {{'5', '3', '.', '.', '7', '.', '.', '.', '.'}, {'6', '.', '.', '1', '9', '5', '.', '.', '.'}, {'.', '9', '8', '.', '.', '.', '.', '6', '.'}, {'8', '.', '.', '.', '6', '.', '.', '.', '3'}, {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, {'7', '.', '.', '.', '2', '.', '.', '.', '6'}, {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, {'.', '.', '.', '4', '1', '9', '.', '.', '5'}, {'.', '.', '.', '.', '8', '.', '.', '7', '9'}};
		System.out.println(isValidSudoku(board));
	}

}
